/*************************************************
 *	文件名称：HString.c
 *	文件说明：串的堆分配存储结构表示 的函数实现
 *	程序平台：
 *	文件作者：Jason <jasonsunsoft@163.com>
 *	文件时间：2014年10月3日20:05
*************************************************/

#include "HString.h"

//--------- 基本操作的算法描述 --------------
Status StrAssign(HString *T, char * chars)
//初始条件：
//操作结果：生成一个其值等于串常亮 chars 的串T
{
	int i, n;
	char *c;
	if (T->ch)				//释放T原有空间
		free(T->ch);
	for(i = 0, c = chars; *c; ++i, ++c);		//求chars的长度i
	if (!i)
	{
		T->ch = NULL;
		T->length = 0;
	}
	else
	{
		if (!(T->ch = (char *)malloc(i * sizeof(char))))
			exit(OVERFLOW);
		for (n = 0; n < i; n++)
			T->ch[n] = chars[n];
		T->length = i;
	}
	return OK;
}	//StrAssign

int Strlength(HString S)
//初始条件：
//操作结果：返回S的元素个数，称其为串的长度
{
	return S.length;
}//Strlength

int StrCompare(HString S, HString T)
//初始条件：
//操作结果：若 S > T, 则返回值 > 0；若 S = T, 则返回值 = 0；若 S < T, 则返回值 < 0
{
	int i;

	for (i = 0; i < S.length && i < T.length; ++i)
	{
		if (S.ch[i] != T.ch[i])
			return S.ch[i] - T.ch[i];
	}
	return S.length - T.length;
}	//StrCompare

Status ClearString(HString *S)
//初始条件：
//操作结果：将S清为空串，并释放S所占空间
{
	if (S->ch)
	{
		free(S->ch);
		S->ch = NULL;
	}
	S->length = 0;
	return OK;
}	//ClearString

Status Concat(HString *T, HString S1, HString S2)
//初始条件：
//操作结果：用T返回由S1和S2连接而成的新串
{
	int i;

	if (T->ch)
		free(T->ch);
	if (!(T->ch = (char *)malloc((S1.length + S2.length) * sizeof(char))))
		exit(OVERFLOW);
	for (i = 0; i < S1.length; ++i)
		T->ch[i] = S1.ch[i];
	T->length = S1.length + S2.length;
	for(i = S1.length; i < T->length; ++i)
		T->ch[i] = S2.ch[i - S1.length];
	return OK;
}

Status SubString(HString *Sub, HString S, int pos, int len)
//初始条件：1 <= pos <= SteLength(S) 且 0 <= len <= StrLength(S) -pos +1
//操作结果：返回串的第pos个字符起长度为len的子串
{
	int i;

    if (pos < 1 || pos > S.length || len < 0 || len > S.length - pos + 1)
		return ERROR;
	if (Sub->ch)			//
		free(Sub->ch);
	if (!len)
	{
		Sub->ch = NULL;
		Sub->length = 0;
	}
	else
	{
		Sub->ch = (char *)malloc(len * sizeof(char));
		if (!Sub->ch)
			exit(OVERFLOW);
		for(i = 0; i < len; ++i)
			Sub->ch[i] = S.ch[pos + i - 1];
		Sub->length = len;
	}
	return OK;
}

